Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3장. Go 프로그램의 기본 구조

2장에서 짠 Hello, World 의 다섯 줄을 다시 펼쳐 본다. 짧지만 Go 프로그램의 골격이 모두 들어 있다.

목표:

  • 모든 Go 파일이 갖는 공통 구조 이해하기
  • 어떤 줄이 왜 필요한지 설명할 수 있게 되기
  • gofmt 로 코드 스타일을 통일하기

3.1 가장 작은 Go 프로그램 다시 보기

package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}

이 안에는 세 종류의 요소가 있다.

  1. 패키지 선언 (package main)
  2. 임포트 (import "fmt")
  3. 함수 정의 (func main() { ... })

이 셋이 모든 Go 파일의 뼈대다. 하나씩 풀어 본다.


3.2 package 선언

package main

모든 Go 파일은 첫 줄에 반드시 자신이 속한 패키지를 선언한다.

  • 빠지면 컴파일 에러
  • 한 디렉터리의 모든 .go 파일은 같은 패키지 이름을 써야 한다

main 패키지의 특별함

main 이라는 이름의 패키지는 특별한 의미가 있다.

  • 실행 가능한 프로그램임을 뜻한다
  • func main() 이 프로그램의 시작점이다
  • go build 하면 실행 파일이 만들어진다

다른 이름의 패키지

main 이 아닌 이름이면 라이브러리 패키지가 된다.

package math

라이브러리 패키지는 단독 실행되지 않는다. 다른 패키지가 import 해서 사용한다.

패키지를 직접 만드는 방법은 20장에서 다룬다. 지금은 “내가 짜는 실행 프로그램은 항상 package main” 정도만 기억하면 된다.


3.3 import 와 표준 라이브러리

import "fmt"

다른 패키지의 기능을 가져다 쓸 때 임포트한다. fmt 는 Go 가 기본 제공하는 표준 라이브러리 중 하나다.

여러 패키지 가져오기

여러 개를 임포트할 땐 괄호로 묶는다.

import (
	"fmt"
	"strings"
	"time"
)

안 쓰는 패키지를 임포트하면?

컴파일 에러가 난다.

imported and not used: "strings"

Go 는 “쓰지도 않을 거 import 해 두는” 습관을 처음부터 막는다.

자주 쓰는 표준 라이브러리

패키지용도
fmt입출력, 문자열 포매팅
strings문자열 처리
strconv문자열-숫자 변환
time시간
os운영체제 (파일, 환경변수 등)
net/httpHTTP 서버 / 클라이언트
encoding/jsonJSON 처리

3.4 func main 의 역할

func main() {
	fmt.Println("Hello, World!")
}
  • func 는 함수를 정의하는 키워드
  • main 이라는 이름의 함수가 프로그램 시작점
  • 매개변수도, 반환값도 없다
  • 중괄호 { } 안에 실행될 코드를 적는다

main 의 제약

  • package main 안에 정확히 하나만 있어야 한다
  • 매개변수도 반환값도 가질 수 없다
  • 라이브러리 패키지에는 main 을 두지 않는다

함수 자체에 대한 자세한 설명은 9장에서 다룬다. 여기선 “프로그램이 여기서 시작한다” 정도만 알면 충분하다.


3.5 세미콜론과 중괄호 규칙

세미콜론이 안 보이는 이유

C / Java / JavaScript 같은 언어에선 줄 끝마다 세미콜론 ; 을 쓴다. Go 도 내부적으로는 세미콜론을 쓰지만, 컴파일러가 줄바꿈을 보고 자동으로 넣어 준다.

그래서 우리가 직접 적을 일은 거의 없다.

중괄호 위치 규칙

이 규칙은 Go 에서 굉장히 엄격하다.

// OK
func main() {
}

// 컴파일 에러
func main()
{
}

여는 중괄호 { 는 같은 줄에 있어야 한다.

세미콜론 자동 삽입 규칙 때문에 그렇다. func main() 다음에 줄바꿈이 오면 컴파일러가 그 자리에 세미콜론을 넣어 버려서 { 가 따로 떨어진 문법 에러가 된다.


3.6 주석 쓰기

Go 의 주석은 두 가지다.

한 줄 주석

// 이 줄은 주석이다.
fmt.Println("Hello")  // 줄 끝에 붙여도 된다.

여러 줄 주석

/*
여러 줄에 걸친 주석.
이 안은 컴파일러가 무시한다.
*/

문서 주석 (godoc) 관례

Go 에선 함수나 패키지 바로 위에 적는 주석이 자동으로 공식 문서가 된다.

// Greet 는 주어진 이름으로 인사말을 만든다.
func Greet(name string) string {
	return "Hello, " + name
}

godoc 또는 https://pkg.go.dev 에서 이 주석이 그대로 문서로 노출된다. 이름과 함께 시작하는 한 문장 요약이 관례다.


3.7 gofmt 로 코드 정리

Go 에는 공식 코드 포매터 gofmt 가 함께 배포된다.

사용법

gofmt -w main.go
  • -w 는 정리된 결과를 파일에 덮어쓰라는 뜻
  • 옵션 없이 실행하면 결과를 화면에만 보여준다

전체 디렉터리를 한 번에 정리할 수도 있다.

gofmt -w .

VS Code 에서는 자동으로

VS Code 의 Go 확장은 저장할 때마다 자동으로 gofmt 를 돌려 준다. 손으로 명령을 칠 일은 거의 없다.

왜 모든 Go 코드가 똑같이 생겼나

gofmt 가 강제하는 규칙은 다음과 같다.

  • 들여쓰기는 탭 (스페이스 X)
  • 줄 끝의 잉여 공백 제거
  • import 자동 정렬
  • 연산자 주변 공백 정리
  • 중괄호 위치 통일

Go 커뮤니티에서는 “코드 스타일 회의” 자체가 사라졌다. 모두가 gofmt 결과를 따르기 때문이다.


3.8 정리

  • 모든 Go 파일은 package 선언으로 시작한다
  • 실행 프로그램은 package main + func main() 조합
  • 외부 기능은 import 로 가져온다
  • 세미콜론은 자동 삽입되고, 중괄호 위치는 엄격하다
  • 주석은 ///* */ 두 가지
  • gofmt 가 코드 스타일을 자동으로 통일해 준다

이제 Go 프로그램의 골격은 다 봤다. 다음 장부터 본격적으로 데이터를 다루기 시작한다. 4장에서는 변수와 자료형부터 출발한다.